Modern microcontroller (MCU) architectures can be (re)programmed with instructions (e.g. firmware, operating system, application, etc.) that are stored in a computer-readable medium (e.g. flash memory) and subsequently executed every time the MCU restarts. Such devices can also be equipped with communications interfaces that allow the device to receive messages containing new instructions, configuration settings and other data.